import {
  Store as VuexStore,          // VuexStore用于定义Vuex store实例的类型
  CommitOptions,               // CommitOptions用于定义提交mutation时的最后一个参数
  DispatchOptions,             // DispatchOptions用于定义分发action时的最后一天个参数
  Module                       // Module用于定义Vuex模块的类型(主要是分多模块使用)
} from 'vuex'

  
  // TODO: How to surpass cyclical dependency linting errors cleanly?
  import { RootState } from '@/store'
  import { state } from './state'
  import { mutations, Mutations } from './mutations'
  import { actions, Actions } from './actions'
  import type { AppState } from './state'
  
  export { AppState }
  //用于创建一个新的类型，该类型基于 VuexStore<S>，但剔除了 'getters'、'commit' 和 'dispatch' 三个属性。
  //&  用于取各个对象的交集 Omit踢除掉  keyof 获取到键值对中的键   Parameters对函数参数进行解析得到数组  ReturnType函数返回类型
  export type AppStore<S = AppState> = Omit<VuexStore<S>, 'getters' | 'commit' | 'dispatch'>
  & {
    commit<K extends keyof Mutations, P extends Parameters<Mutations[K]>[1]>(
      key: K,  //函数名字
      payload: P,  //函数参数
      options?: CommitOptions  //commit 的最后一个参数options可选的
    ): ReturnType<Mutations[K]>
  } & {
    dispatch<K extends keyof Actions>(
      key: K,
      payload: Parameters<Actions[K]>[1],
      options?: DispatchOptions
    ): ReturnType<Actions[K]>
  };
  //这个大概的意思是:
  /*
  interface RootState {
    app: AppState
    user: UserState
  }
  */
 //AppState指的是单个模块的state,RootState指的是多个模块的state
  export const store: Module<AppState, RootState> = {
    state,
    mutations,
    actions
    // TODO: With namespaced option turned on, having problem how to use dispatch with action types...
    // But without it, a bigger store might have clashes in namings
    // namespaced: true,不开启命名空间,命名空间的其他定义在store/index.ts中
  }